#ifndef CWTRAINER_H
#define CWTRAINER_H

#include <gtk/gtk.h>
#include "config.h"
#include "morse.h"
#include "audio.h"
#include <string>
#include <algorithm>

class CWTrainer {
public:
    CWTrainer();
    ~CWTrainer();
    
    // 初始化UI
    void initialize();
    
    // 运行主循环
    int run(int argc, char** argv);
    
private:
    // 控件指针
    GtkApplication *app;
    GtkWidget *window;
    GtkWidget *paned;
    GtkWidget *leftPanel;
    GtkWidget *rightPanel;
    GtkWidget *startButton;
    GtkWidget *inputEntry;
    GtkWidget *resultTextView;
    GtkTextBuffer *resultBuffer;
    
    // 功能对象
    Config config;
    MorseConverter morseConverter;
    AudioPlayer audioPlayer;
    
    // 当前练习数据
    std::string currentCWString;
    bool isExerciseRunning;
    int correctCount=0,runCount=0;
    
    // 创建UI组件
    // 修改 createWindow 函数声明以匹配实现
    static void createWindow(GtkApplication *app, gpointer data);
    void createMenu();
    void createLeftPanel();
    void createRightPanel();
    
    // 事件处理函数
    static void onStartButtonClicked(GtkWidget *widget, gpointer data);
    static void onInputChanged(GtkEditable *editable, gpointer data);
    static void onConfigMenuClicked(GSimpleAction *action, GVariant *parameter, gpointer data);
    
    // 配置对话框
    void showConfigDialog();
    
    // 练习相关函数
    void playBeepAndShowText(int timers);
    void callPlayCW();
    void startCountdown();
    void generateCWString();
    void playCWString();
    void checkInput();
    void displayResult(const std::string& inputStr);
    
    // 工具函数
    std::string generateRandomString(int length, const std::string& charset);
    void appendToResultView(const std::string& text, const std::string& color = "black");
};

#endif // CWTRAINER_H